#-*- coding:utf-8 -*-
import paramiko
from time import sleep
import re


#使用paramiko库以ssh、sftp方式连接服务器，并临时修改用户环境变量，保证返回结果一致性，便于结果判断
class myTrans():
    def __init__(self,ip=None,port=22,uname=None,passwd=None):
        self.ip=str(ip)
        self.port=int(port)
        self.uname=uname
        self.passwd=passwd
        self._connect()

    #连接服务器并验证身份
    def _connect(self):
        trans=paramiko.Transport((self.ip,self.port))
        trans.start_client()
        trans.auth_password(self.uname,self.passwd)
        self.__trans=trans

    #sftp下载
    def donwload(self,serverpath,localpath):
        self.lpath=localpath
        self.spath=serverpath
        self.sftp=paramiko.SFTPClient.from_transport(self.__trans)
        self.sftp.get(self.spath,self.lpath)
    #sftp
    def upload(self,localpath,serverpath):
        self.lpath=localpath
        self.spath=serverpath
        self.sftp=paramiko.SFTPClient.from_transport(self.__trans)
        self.sftp.put(self.lpath,self.spath)

    #获取终端并激活，获取服务器系统名称
    def create_chan(self):
        self.chan=self.__trans.open_session()
        self.chan.get_pty()
        self.chan.invoke_shell()
        self.chan.send(u'export PS1=">"\n')
        self.chan.send(u'uname\n')

        result=''
         
        while True:
                sleep(0.5)
                res=self.chan.recv(65535)
                result+=res
                if res.endswith('>'):
                    break

        self.sysname=re.search(r'(Linux|AIX|HP-UX)', result).group(1)
        # AIX不支持ps的--color参数，根据系统执行不同指令
        if self.sysname == 'Linux':
            self.ps = 'ps -ef | grep --color=never'
        elif self.sysname == 'AIX':
            self.ps = 'ps -ef | grep'
        else:
            self.root.set_res('HP-UX系统不支持nmon监控！\n')
            
    #执行linux命令，并将结果赋值给self.result，实例对象可调用
    def exec_cmd(self,command):
        self.cmd=command
        result=''
        for i in self.cmd:
            self.chan.send(i)
            while True:
                sleep(0.5)
                res=self.chan.recv(65535)
                result+=res
                if res.endswith('>'):
                    break
        result=re.sub('>$','',result)
        self.result=result
        
        
    def exit(self):
        self.__trans.close()
